package com.jiang.剑指Offer.动态规划.NC127;

/**
 * @author Jiang
 * @version 1.0
 * @date 2024/12/13 22:52
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * longest common substring
     * @param str1 string字符串 the string
     * @param str2 string字符串 the string
     * @return string字符串
     */
    public String LCS (String str1, String str2) {
        // 暴力解决
        // int len1 = str1.length();
        // int len2 = str2.length();
        // int startIndex = -1;
        // int endIndex = -1;
        // int maxLen = 0;
        // for (int i = 0; i < len1; i++) {
        //     for (int j = 0; j < len2; j++) {
        //         if (str1.charAt(i) == str2.charAt(j)) {
        //             int temp = i + 1;
        //             int len = 1;
        //             int k = j + 1;
        //             for (; k < len2 && temp < len1;) {
        //                 if (str1.charAt(temp) == str2.charAt(k)) {
        //                     temp++;
        //                     len++;
        //                     k++;
        //                 } else {
        //                     break;
        //                 }
        //             }
        //             if (len > maxLen) {
        //                 maxLen = len;
        //                 startIndex = j;
        //                 endIndex = k;
        //             }
        //         }
        //     }
        // }
        // return str2.substring(startIndex, endIndex);

        // 滑动窗口
        // int startIndex = 0;
        // int endIndex = 1;
        // String res = null;
        // while(endIndex <= str2.length()) {
        //     String t = str2.substring(startIndex, endIndex);
        //     if (str1.contains(t)) {
        //         res = t;
        //     } else {
        //         startIndex++;
        //     }
        //     endIndex++;
        // }
        // return res;

        // 动态规划
        int maxLen = 0; //记录最长公共子串的长度
        int endIndex = 0; //记录最长公共子串最后一个元素在字符串str1中的位置
        int[][] dp = new int[str1.length() + 1][str2.length() + 1];
        for (int i = 0; i < str1.length(); i++) {
            for (int j = 0; j < str2.length(); j++) {
                //递推公式，两个字符相等的情况
                if (str1.charAt(i) == str2.charAt(j)) {
                    dp[i + 1][j + 1] = dp[i][j] + 1;
                    //如果遇到了更长的子串，要更新，记录最长子串的长度，
                    //以及最长子串最后一个元素的位置
                    if (dp[i + 1][j + 1] > maxLen) {
                        maxLen = dp[i + 1][j + 1];
                        endIndex = i;
                    }
                }
            }
        }
        return str1.substring(endIndex - maxLen + 1, endIndex + 1);
    }
}
